#include<stdio.h>
#define num 30000
const int max = 1000000000l;
int m,n;
long d[num];
int nHeap,heap[num];
int post[num],isfree[num];
int ngang[num],doc[num];
void input(){
    int i,j,u,v,l;
    scanf("%d%d",&m,&n);
    
    for(i=0;i<=m;i++)
        for(j=0;j<n;j++)d[i*n+j]=max;
    d[0]=0;    
    for(i=1;i<=m;i++){
        for(j=0;j<n;j++)scanf("%d",&ngang[i*n+j]);
        for(j=1;j<n;j++)scanf("%d",&doc[i*n+j]); 
    }
}
void update(int v){
    int chid=post[v],parent;
    if(chid==0)chid=++nHeap;
    parent=chid/2;
    while(parent>0 && d[heap[parent]]>d[v]){
        heap[chid]=heap[parent];
        post[heap[chid]]=chid;
        chid=parent;
        parent=chid/2;
    }
    heap[chid]=v;
    post[v]=chid;
}
int pop(){
    int r=1,c,v=heap[nHeap],ret=heap[1];
    nHeap--;
    while(2*r<=nHeap){
        c=2*r;
        if(c<nHeap && d[heap[c+1]]<d[heap[c]]) c++;
        if(d[v]<=d[heap[c]])break;
        heap[r]=heap[c];
        post[heap[r]]=r;
        r=c;
    }
    heap[r]=v;
    post[v]=r;
    return ret;
}
void dijkstra(){
    int i,u,iv,v,min;
    update(0);
    do{
        u=pop();
        if(u==n*m-1+n)return;
        isfree[u]=1;
        /* Len tren*/
        if(u>=n && !isfree[u-n] &&  d[u-n]>d[u]+ngang[u]){
            d[u-n]=d[u]+ngang[u];
            update(u-n);
        }
        /* Xuong duoi */
        if(u/n<m && !isfree[u+n] && d[u+n]>d[u]+ngang[u+n]){
            d[u+n]=d[u]+ngang[u+n];
            update(u+n);
        }
        /* Sang trai */
        if(u%n>0 && !isfree[u-1] && d[u-1]>d[u]+doc[u]){
            d[u-1]=d[u]+doc[u];
            update(u-1);
        }
        /* Sang phai */
        if(u%n<n-1 && !isfree[u+1] && d[u+1]>d[u]+doc[u+1]){
            d[u+1]=d[u]+doc[u+1];
            update(u+1);
        }
    }while(1);
}    
int main(){
    input();
    dijkstra();
    printf("%d",d[n*m-1+n]);
    return 0;
}
